MediaLiveとMediaPackageをCMAF Ingestで連携させてみた!

MediaLiveとMediaPackageをCMAF Ingestで連携させてみた!

MediaPackageではv2が必須でありChannel作成後にInput typeが変更できないこと、MediaLiveではCMAF Ingest Groupが1つのOutputに1つdescriptionしか含められないことに注意しましょう。
Clock Icon2024.08.19

はじめに

清水です。少し前、2024/04/08のアップデートですが、AWS Elemental MediaLiveがCMAF Ingest output groupをサポートしました。

CMAF Ingest (Interface-1)を利用することで同期されたメディアとメターデータをパッケージングオリジンに送信することが可能になります。このMediaLiveのアップデートから遅れることおよそ2ヶ月、2024/06/14付けでMediaPackageでもCMAF IngestのInput typeをサポートするアップデートがありました。

そこから更に2ヶ月ほど時間が経ってしまいましたが、本エントリではMediaLiveとMediaPackageをCMAF Ingestで連携させてみたので、その手順などをまとめてみたいと思います。

なお、このCMAF Ingest (Interface-1)サポートの真髄は、上記アップデート情報のタイトルにもなっていますがMediaPackageでCross-region failoverが可能になったことにあるかと考えます。以下AWS for M&E Blogにも関連エントリが投稿されていますね。

本エントリではあくまで単一リージョンでのMediaLiveとMediaPackageのCMAF Ingest連携についてまとめ、Cross-region failoverな構成については別エントリで確認したいと思います。

CMAF IngestなInputのMediaPackageリソースの作成

まずはMediaPackageのリソース作成からはじめます。なお、CMAF Ingest Input typeがサポートされているのはMediaPackage v2だけです。MediaPacakge v1では未サポートである点に注意しましょう。

MediaPackageのマネジメントコンソール、Live v2のChannel gropusページ進み[Create channel group]ボタンを押下します。(既存のChannel groupsを使用してChannelの作成からはじめてもかまいません。)

ci01

Channel group nameを適切に入力、[Create]ボタンで作成します。

ci02

Channel gropuが作成できたら、続いて[Create channel]ボタンでChannelの作成に進みます。

ci03

Create channelの画面、以前はNameとDescription、そしてChannel policyの項目しかありませんでした。(例えば「[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO」のエントリなどで当時のスクリーンショットが確認できます。)今回のアップデートでInput typeの選択が追加されていますね。適切なChannel nameを入力、Input typeではアップデート内容であるCMAFを選択しましょう。

ci04

Input typeについてのInfoを確認すると、現在MediaPackageではHLS/TSに加えてCMAF IngestをInputとしてサポートしていることが明記されています。User Guideの以下項目へのリンクも記載されていますね。

User GuideではCMAF Input type利用にあたり細かな条件などが記載されていますので、一度目を通しておきましょう。またChannel作成後のInput typeの変更はできないことが明記されています、この点には注意ですね。そしてCross-region failoverや今後リリースされるその他の機能についてはCMAF Ingestでのみ利用可能となるそうです。可能な場合はCMAF Ingestを使用することを検討しましょう。

Channel policyはアタッチせずに[Create]ボタンでChannelを作成します。作成後、Settingsの項目でInput typeがCMAFとなっていることが確認できます。

ci05

続いてOrigin endpointsの項目、[Create endpoint]ボタンでendpointを作成します。Endpoint settingsでNameを適切に入力、Container typeはTSを利用しました。Additional settingsの項目には今回触りません。

ci06

Segment settingsとEncryptionについてもデフォルトのまま進めます。

ci07

Endpoint policyについては、今回はAttach a public policyを選択しました。用途に合わせて適切なものを選択しましょう。

ci08

Manifest definitionsの設定です。今回はHLS manifestのみ作成しました。Manifest nameならびにChild manifest nameを適切に入力します。そのほかの項目はデフォルトで進めました。[Create]ボタンでOrigin endpointを作成します。

ci09

Origin endpointが作成できました。

ci10

続いてMediaLive側の設定に進みますが、上記で作成したMediaPackageリソースのうち Channelの Ingest endpointの情報が必要になります。Channel詳細画面のSettingsの項目、Ingest endpoint 1の情報をメモしておきましょう。

ci11

CMAF IngestなOutputのMediaLiveリソースの作成

続いてMediaLiveリソースの作成です。最近はWorkflow wizardで検証用のMediaLiveリソースを作成することが多く、Output(Video、Audio)のコーデックなど細かな設定を省いてしまうのですが、CMAF Ingest output groupを使用する場合はこの手段が採れません。Channel Templateについても同様です。そのため今回は、 Workflow wizardで作成したChannelのVideo、AudioなどOutput設定を真似ながら新規にChannelを作成する という手段をとりました。

サンプルとなるWorkflowを作成

まずはサンプルとなるWorkflowの作成です。ポイントとなるのはStep 3 Add video outputsの項目です。Output gropuとしてMediaPackageを選択し、Video renditionsでは1080p30720p30の2種類を選択しました。

ci12

以下内容でWorkflowを作成し、このChannel設定を参考にします。

ci13

ci14

Inputの作成

CMAF Ingest output type用のInputの作成です。これは通常のInputと特に変わりありません。Input typeとして今回はRTMP (push)を利用しました。また検証用途ですのでSINGLE_INPUTで進めました。

ci15

ci16

ci17

Channelの作成

続いてChannelの作成です。Channel and input detailsやGeneral settings、そしてInput attachmentsの設定については通常と特に変わりありませんので省略します。(なおInputと同様、Channel classはSINGLE_PIPELINEを選択しています。)Output groupの箇所がポイントですね。Add output groupでCMAF Ingestを選択して[Confirm]します。(送信先がMediaPackageではありますが、CMAF Ingest利用の際にはここでMediaPackageを選んでは いけません 。)

ci18

CMAF ingest groupの設定項目、まずはdestination URLを設定しましょう。先ほどMediaPackageリソース作成の最後で確認したChannelリソースのIngest endpoint 1の情報(URL)を入力します。Credentialsの項目については空欄のまま進めます。

ci19

CMAF Ingest settingsではNameを適切に設定しておきます。そのほかの項目はデフォルトのまま進めました。

ci20

CMAF Ingest outputsの項目です。今回のポイントのひとつかと思います。Video renditionについてはWorkflow wizardで作成したChannelを参考にします。Workflowで作成したChannelでは以下のように2つのOutputがあり、その中にVideoとAudioがありますね。

  • MediaPackage outputs
    • Output 1: emp_1080p30
      • Video: emp_1080p30
      • Audio 1: audio_mediapackage_0
    • Output 2: emp_720p30
      • Video: emp_720p30
      • Audio 1: audio_mediapackage_1

ci21

ci22

この構成をCMAF Ingest outputで再現しようとしてもうまくいきませんでした。以下のように "For CMAF Ingest Groups, outputs can only contain a video description, 1 audio description, or 1 caption description." とValidation Errorとなってしまいます。VideoとAudioを同一のOutputに混在させるという設定がCMAF Ingest outputで許可されておらず、1つのOutputには1つのVideoもしくはAudioのみを含めるよう設定する必要があるということですね。

ci23

結果、以下のように設定を行いました。Outputを合計3つ準備し、2種類の解像度別のVideoとAudioを並べます。

  • CMAF Ingest outputs
    • Output 1: video_1080p30
      • Video: video_1080p30
    • Output 2: video_720p30
      • Video: video_720p30
    • Output 3: audio_aac
      • Audio 1: audio_aac

またそれぞれのOutputについて、先のWorkflow wizardで作成したChannelを参考に設定をしていきます。具体的にはVideoであれば解像度やCodec(H264を使用)、Aspect RatioやRate Control、Frame Rate、GOP Structure、Codec Detailを設定しました。AudioについてはCodec Setting(AACを使用)とそのBitrateというぐあいです。

ci24

ci25

ci26

ci27

[Create channel]ボタンでChannelリソースを作成します。なお以下JSONファイルが、上記で作成したChannelから"Download custom template"で得られたテンプレートファイルからリソース固有の情報を除いたものとなります。

medialive-cmaf-ingest-channel-template.json

ライブストリーミングの視聴確認

Output gropu typeとしてCMAF Ingestを指定したMediaLiveリソース、ならびにInput typeとしてCMAF Ingestを指定したMediaPackageリソースが作成できました。実際にこのMediaLive→MediaPackage連携を通してライブストリーミングの視聴を確認してみます。

MediaLive ChannelをStartさせ、手元のMacBook ProのOBS StudioからMediaLive Inputに対して映像を打ち上げます。

ci28

MediaPackageのOrigin endpoint画面ででHLS manifest definitionsを確認、今回は[Preview]ボタンから開けるhls.js demoページでライブストリーミングの視聴を確認しました。問題なく視聴ができていますね!

ci29

なおライブストリーミングの視聴をしているMediaPackageのOrigin endpointでは、ContainerでTS、Manifest definitionsではHLS manifestのみを設定していました。ライブストリーミングもm3u8ならびにtsファイルで構成されています。MediaLiveとMediaPackageをCMAFで連携させた部分、MediaPackageでのライブストリーミング視聴の際には表立って現れない点に注意しましょう。

ci30

MediaLiveのCMAF Ingest Outputはどんなファイルを出力しているのか

MediaLiveとMediaPackageをCMAF Ingestで連携させ、ライブストリーミングを視聴してみました。さてライブストリーミングの視聴ではCMAF Ingestでの連携部分、どんなファイルをMediaLiveが出力しMediaPackageの入力となっているのか、という点の確認ができませんでした。ここではMediaLiveのCMAF Ingest Output group typeでどのようなファイルを出力しているのか、簡単に確認してみたいと思います。

EC2上にWebDAVサーバを構築し、MediaLiveのCMAF Ingest Output groupの出力先をそのWebDAVサーバに向けます。EC2上で実際にどんなファイルが出力されているのかを確認するという算段です。

WebDAV on EC2な環境は以下ブログエントリの手順をもとにnginxで準備しました。

MediaLive Channelリソースで[Edit channel]]、cmaf-ingest output groupsのCMAF Ingest destination AのURLをWebDAV on EC2のものに変更します。

ci31

MediaLive ChannelをStartさせ、OBS Studioから映像を打ち上げます。EC2上でMediaLiveから書き込まれているファイルを確認してみましょう。以下のように、Streams(audio_aac.cmfa)Streams(video_720p30.cmfv)Streams(video_1080p30.cmfv)の3つのファイルが作成されています。このそれぞれのファイルは適宜更新されているようで、確認するたびに異なるファイル容量となっていることがわかりました。

[ec2-user@ip-10-82-21-86 medialive-cmaf-ingest]$ date; ls -l
Mon Aug 19 03:13:56 UTC 2024
total 880
-rw-rw-r--. 1 nobody nobody  32543 Aug 19 03:13 'Streams(audio_aac.cmfa)'
-rw-rw-r--. 1 nobody nobody 691577 Aug 19 03:13 'Streams(video_1080p30.cmfv)'
-rw-rw-r--. 1 nobody nobody 175447 Aug 19 03:13 'Streams(video_720p30.cmfv)'
[ec2-user@ip-10-82-21-86 medialive-cmaf-ingest]$ date; ls -l
Mon Aug 19 03:14:03 UTC 2024
total 696
-rw-rw-r--. 1 nobody nobody  32684 Aug 19 03:14 'Streams(audio_aac.cmfa)'
-rw-rw-r--. 1 nobody nobody 522400 Aug 19 03:14 'Streams(video_1080p30.cmfv)'
-rw-rw-r--. 1 nobody nobody 153198 Aug 19 03:14 'Streams(video_720p30.cmfv)'

なおこのStreams(video_1080p30.cmfv)などのファイル単体をVLC media playerなどいくつかのPlayerで再生できるか確認してみたのですが、再生・視聴はできませんでした。CMAF Ingest形式に対応したPlayerなどが別途必要になるのかな、と認識しています。

まとめ

CMAF Ingest Output GropuなMediaLiveとCMAF Ingest InputなMediaPackageを連携させてライブストリーミングを行ってみました。基本的な手順は通常のMediaLiveとMediaPackage連携と変わらないかと思います。MediaPackageではv1ではなくv2の利用が必要であること、またChannel作成時にInput typeを選択しますがこの変更ができないことに注意しましょう。MediaLiveではOutput groupでCMAF Ingestを指定します。Workflow wizardやChannel templateでは現在CMAF Ingest Output Groupに対応したものがない点にも注意しましょう。

今回はシンプルに単一リージョンでのCMAF Ingestを使ったMediaLiveとMediaPackageの連携を確認しました。冒頭にも記載しましたが今回のCMAF Ingest対応アップデート、真髄はCross-region failoverを考慮したライブストリーミングアーキテクチャが容易に構成できるようになったことかと考えます。こちらについては別エントリにてまとめてみたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.